package com.tuling.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class NioServer {

    private static final List<SocketChannel> channelList = new ArrayList<>();

    public static void main(String[] args) {
        try {
            ServerSocketChannel serverSocket = ServerSocketChannel.open();

            serverSocket.socket().bind(new InetSocketAddress("127.0.0.1", 9999));

            serverSocket.configureBlocking(false);

            System.out.println("服务器启动成功");

            while (true) {
                //非阻塞模式的accept方法不会阻塞
                //NIO的非阻塞是由操作系统内部实现的，底层调用了linux内核的accept函数
                SocketChannel socketChannel = serverSocket.accept();
                if (socketChannel != null) {
                    channelList.add(socketChannel);
                }
                // 遍历连接进行数据读取
                Iterator<SocketChannel> iterator = channelList.iterator();
                while (iterator.hasNext()) {
                    SocketChannel sc = iterator.next();
                    ByteBuffer byteBuffer = ByteBuffer.allocate(128);
                    int len = sc.read(byteBuffer);
                    if (len > 0) {
                        System.out.println("接收到消息 = " + new String(byteBuffer.array()));
                    } else if (len == -1) {
                        iterator.remove();
                        System.out.println("客户端断开连接");
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
